quartz: added open capability to gtk_application
authorFriedrich Beckmann <friedrich.beckmann@gmx.de>
Tue, 16 Jun 2020 14:59:06 +0000 (16:59 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 16 Jun 2020 16:42:48 +0000 (12:42 -0400)
This patch implements the openFiles delegate which is required
to open files which are associated with an application via the
Finder or via open on the command line. The patch has been
proposed by jessevdk@gmail.com.

See: https://gitlab.gnome.org/GNOME/gtk/-/issues/463

I tested the patch with the GNU pspp application on MacOS with
the quartz backend.

gtk/gtkapplication-quartz.c

index 38131f4be00bbfd75cd4d220451a21c714220fb9..90ab1705f04b16000356011cf3d1ea01f2ce2e68 100644 (file)
@@ -64,6 +64,7 @@ G_DEFINE_TYPE (GtkApplicationImplQuartz, gtk_application_impl_quartz, GTK_TYPE_A
 
 - (id)initWithImpl:(GtkApplicationImplQuartz*)impl;
 - (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender;
+- (void)application:(NSApplication *)theApplication openFiles:(NSArray *)filenames;
 @end
 
 @implementation GtkApplicationQuartzDelegate
@@ -84,6 +85,35 @@ G_DEFINE_TYPE (GtkApplicationImplQuartz, gtk_application_impl_quartz, GTK_TYPE_A
    */
   return quartz->quit_inhibit == 0 ? NSTerminateNow : NSTerminateCancel;
 }
+
+-(void)application:(NSApplication *)theApplication openFiles:(NSArray *)filenames
+{
+  GFile **files;
+  gint i;
+  GApplicationFlags flags;
+
+  flags = g_application_get_flags (G_APPLICATION (quartz->impl.application));
+
+  if (~flags & G_APPLICATION_HANDLES_OPEN)
+    {
+      [theApplication replyToOpenOrPrint:NSApplicationDelegateReplyFailure];
+      return;
+    }
+
+  files = g_new (GFile *, [filenames count]);
+
+  for (i = 0; i < [filenames count]; i++)
+    files[i] = g_file_new_for_path ([(NSString *)[filenames objectAtIndex:i] UTF8String]);
+
+  g_application_open (G_APPLICATION (quartz->impl.application), files, [filenames count], "");
+
+  for (i = 0; i < [filenames count]; i++)
+    g_object_unref (files[i]);
+
+  g_free (files);
+
+  [theApplication replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
+}
 @end
 
 /* these exist only for accel handling */